#include <iostream>
#include <unistd.h>

int g_val = 100;
int main()
{
    pid_t id = ::fork();
    if(id == 0)
    {
        //child
        while(true)
        {
            g_val = 200;
            std::cout << "child, pid : " << getpid() << ", ppid : " \
            << getppid() << ", g_val : " << g_val << ", &g_val : " << &g_val << std::endl;
            sleep(1);
        }
    }
    else
    {
        //parent
        while(true)
        {
            std::cout << "father, pid : " << getpid() << ", ppid : " \
            << getppid() << ", g_val : " << g_val << ", &g_val : " << &g_val << std::endl;
            sleep(1);
        }
    }
    return 0;
}



// #include <stdio.h>
// #include <stdlib.h>
// #include <unistd.h>


// int g_val = 123;
// int gback;



// int main(int argc, char* argv[], char* env[])
// {
//     static int local_val = 0;
//     static int local_val_b;
//     printf("code addr : %p\n", main);
//     printf("init data addr : %p\n", &g_val);
//     printf("uninit data addr : %p\n", &gback);
//     char* p1 = (char*)malloc(20);
//     char* p2 = (char*)malloc(20);
//     char* p3 = (char*)malloc(20);

//     printf("heap1 addr : %p\n", p1);
//     printf("heap2 addr : %p\n", p2);
//     printf("heap3 addr : %p\n", p3);

//     printf("stack1 addr : %p\n", &p1);
//     printf("stack2 addr : %p\n", &p2);
//     printf("stack3 addr : %p\n", &p3);

//     for (int i = 0; argv[i]; i++)
//     {
//         printf("agrv[%d] : %p\n", i, argv[i]);
//     }
//     printf("\n");
//     for (int i = 0; env[i]; i++)
//     {
//         printf("env[%d] : %p\n", i, env[i]);
//     }

    
//     return 0;
// }






// int g_val = 0;
// int g_val_b;

// static int s_val = 0;
// static int s_val_b;


// int main(int argc, char* aragv[], char* env[])
// {
//     static int local_val = 0;
//     static int local_val_b;
//     printf("code addr : %p\n", main);
//     printf("全局已初始化变量 : %p\n", &g_val);
//     printf("全局未初始化变量 : %p\n", &g_val_b);
//     printf("static全局已初始化变量 : %p\n", &s_val);
//     printf("static全局未初始化变量 : %p\n", &s_val_b);
//     printf("static局部已初始化变量 : %p\n", &local_val);
//     printf("static局部未初始化变量 : %p\n", &local_val_b);

//     // std::cout << "code addr : " << &main << std::endl;
//     // std::cout << "全局已初始化变量 : " << &g_val << std::endl;
//     // std::cout << "全局未初始化变量 : " << &g_val_b << std::endl << std::endl;
//     // std::cout << "static全局已初始化变量 : " << &s_val << std::endl;
//     // std::cout << "static全局未初始化变量 : " << &s_val_b << std::endl << std::endl;
//     // std::cout << "static局部已初始化变量 : " << &local_val << std::endl;
//     // std::cout << "static局部未初始化变量 : " << &local_val_b << std::endl;

//     return 0;
// }



// #include <stdio.h>
// int main()
// {
//     extern char** environ;
//     for (int i = 0; environ[i]; i++)
//     {
//         std::cout << environ[i] << std::endl;
//     }
// }


// int main(int argc, char* argv[], char* env[])
// {
//     for (int i = 0; env[i]; i++)
//     {
//         std::cout << env[i] <<
//     }
// }

// int main()
// {
//     pid_t id = ::fork();
//     if(id == 0)
//     {
//         //child
//         while(true)
//         {
//             std::cout << "I am child, pid : " << getpid() << ", ppid : " \
//             << getppid() << ", id : " << id << std::endl;
//             sleep(1);
//         }
//     }
//     else
//     {
//         //parent
//         int cnt = 3;
//         while(cnt--)
//         {
//             std::cout << "I am father, pid : " << getpid() << ", ppid : " \
//             << getppid() << ", id : " << id << std::endl;
//             sleep(1);
//         }
//     }
//     return 0;
// }
